home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / msysjour / vol06 / 03 / lanman3 / dialog.c next >
C/C++ Source or Header  |  1991-05-01  |  10KB  |  377 lines

  1. //===================================================================
  2. //  Dialog.c
  3. //===================================================================
  4.  
  5. #include "phone.h"
  6. #include "runtime.h"
  7.  
  8. char szCallName[NAMESIZE];
  9. char szTempNumber[NAMESIZE + sizeof(WORD)];
  10.  
  11. BOOL NumberSelected = FALSE;
  12. HWND hListBox;
  13. HWND hEditBox;
  14. extern BOOL config;
  15.  
  16. static struct {
  17.     WORD wCount;
  18.     char szName[MAX_NAMES][NAMESIZE];
  19. } ListQueryNames = {0};
  20.  
  21. //===================================================================
  22. //  ConfigDialogProc()
  23. //===================================================================
  24.  
  25. BOOL FAR PASCAL ConfigDialogProc(hWnd, iMessage, wParam, lParam)
  26. HWND hWnd;
  27. unsigned iMessage;
  28. WORD wParam;
  29. LONG lParam;
  30. {
  31.     switch(iMessage)
  32.     {
  33.     case WM_INITDIALOG:
  34.         //======================================
  35.         // Get name from edit box and place
  36.         //    in szClientName
  37.         //======================================
  38.  
  39.         SetDlgItemText(hWnd, IDD_NUMBER, szClientName);
  40.         break;
  41.  
  42.     case WM_COMMAND:
  43.         switch(wParam)
  44.         {
  45.         case IDD_OK:
  46.             //======================================
  47.             //    The user has pressed the OK button.
  48.             //    Checl for valid name and state.
  49.             //======================================
  50.  
  51.             if ( strlen(szClientName) && state != TALK_STATE )
  52.             {
  53.             state = IDLE_STATE;
  54.             }
  55.             EndDialog(hWnd, TRUE);
  56.             break;
  57.  
  58.         case IDD_CANCEL:
  59.             //======================================
  60.             //    CANCEL button pressed!
  61.             //======================================
  62.  
  63.             EndDialog(hWnd, TRUE);
  64.             break;
  65.  
  66.         case IDD_NUMBER:
  67.             //======================================
  68.             //    A new name was entered, so update
  69.             //    szClientName if not already configured
  70.             //======================================
  71.             if ( !config )
  72.             {
  73.             GetDlgItemText(hWnd, IDD_NUMBER,
  74.                        szClientName,
  75.                        NAMESIZE);
  76.             }
  77.             break;
  78.  
  79.         default:
  80.             return FALSE;
  81.         }
  82.         break;
  83.  
  84.     default: return FALSE;
  85.     }
  86.  
  87.     return TRUE;
  88. }
  89.  
  90. //===================================================================
  91. //  CallDialogProc()
  92. //===================================================================
  93.  
  94. BOOL FAR PASCAL CallDialogProc(hWnd, iMessage, wParam, lParam)
  95. HWND     hWnd;
  96. unsigned iMessage;
  97. WORD     wParam;
  98. LONG     lParam;
  99. {
  100.     WORD   nIndex, i, nLength;
  101.     int    err;
  102.  
  103.     switch(iMessage)
  104.     {
  105.     case WM_INITDIALOG:
  106.         hListBox = GetDlgItem(hWnd, IDD_TEXT);
  107.         hEditBox = GetDlgItem(hWnd, IDD_EDIT);
  108.  
  109.         //======================================
  110.         //    Fill the list box with names from
  111.         //    the names structure
  112.         //======================================
  113.  
  114.         for(i=0; i < ListQueryNames.wCount; ++i)
  115.         {
  116.         SendMessage(hListBox, LB_ADDSTRING, 0,
  117.               (LONG) (LPVOID) ListQueryNames.szName[i]);
  118.         }
  119.  
  120.         //======================================
  121.         //    Submit another ListQuery request.
  122.         //======================================
  123.  
  124.         if ( state == IDLE_STATE )
  125.         SubmitListQuery();
  126.         else
  127.         DisplayMsgBox(hParent, "Could not Submit list query");
  128.         break;
  129.  
  130.     case WM_COMMAND:
  131.         switch(wParam)
  132.         {
  133.         case IDD_DIAL:
  134.             //======================================
  135.             //    The user is calling someone.
  136.             //======================================
  137.  
  138.             EndDialog(hWnd, TRUE);
  139.  
  140.             //======================================
  141.             //    Get the remote name and place it
  142.             //    in szCallName.
  143.             //======================================
  144.  
  145.             if ( GetDlgItemText(hWnd, IDD_EDIT,
  146.                     szCallName, NAMESIZE))
  147.             {
  148.             if (strcmp(szCallName, szClientName) == 0)
  149.             {
  150.                 DisplayMsgBox(hParent,
  151.                       "You may not call yourself.");
  152.             }
  153.             else
  154.             {
  155.                 //======================================
  156.                 //    Enter call state and connect to
  157.                 //    PBX.
  158.                 //======================================
  159.  
  160.                 state = CALL_STATE;
  161.  
  162.                 err = PbxConnect(PipeHandle,
  163.                          szCallName,
  164.                          PHONE_ID);
  165.  
  166.                 if ( err )
  167.                 {
  168.                 state = IDLE_STATE;
  169.  
  170.                 wsprintf(format,
  171.                     "CALLING %s FAILED: %u",
  172.                     szCallName, err);
  173.  
  174.                 DisplayMsgBox(hParent, format);
  175.                 }
  176.             }
  177.             }
  178.             else
  179.             {
  180.             DisplayMsgBox(hParent,
  181.                    "No Selection has been made.");
  182.             }
  183.             break;
  184.  
  185.         case IDD_CANCEL:
  186.             //======================================
  187.             //    The user pressed the CANCEL button.
  188.             //======================================
  189.  
  190.             if ( state != TALK_STATE )
  191.             {
  192.             state = IDLE_STATE;
  193.             }
  194.             EndDialog(hWnd, TRUE);
  195.             break;
  196.  
  197.         case IDD_TEXT:
  198.             //======================================
  199.             //    Get the name from the LISTBOX and
  200.             //    place it in the selection editbox.
  201.             //======================================
  202.  
  203.             nIndex = (WORD) SendMessage(hListBox,
  204.                         LB_GETCURSEL,
  205.                         0, 0L);
  206.  
  207.             if ( SendMessage(hListBox, LB_GETTEXT, nIndex,
  208.                    (LONG) (LPVOID) szCallName) > 0 )
  209.             {
  210.             SetDlgItemText(hWnd, IDD_EDIT, szCallName);
  211.             }
  212.  
  213.             if ( HIWORD(lParam) == LBN_DBLCLK )
  214.             {
  215.             SendMessage(hWnd, WM_COMMAND, IDD_DIAL, 0L);
  216.             }
  217.             break;
  218.  
  219.         default: return FALSE;
  220.         }
  221.         break;
  222.  
  223.     default: return FALSE;
  224.     }
  225.  
  226.     return TRUE;
  227. }
  228.  
  229. //===================================================================
  230. //  AboutDialogProc()
  231. //===================================================================
  232.  
  233. BOOL FAR PASCAL AboutDialogProc(hWnd, iMessage, wParam, lParam)
  234. HWND     hWnd;
  235. unsigned iMessage;
  236. WORD     wParam;
  237. LONG     lParam;
  238. {
  239.     if ( iMessage == WM_COMMAND && wParam == IDD_OK )
  240.     {
  241.     EndDialog(hWnd, FALSE);
  242.     return TRUE;
  243.     }
  244.  
  245.     return FALSE;
  246. }
  247.  
  248. //===================================================================
  249. //  SubmitListQuery() --
  250. //
  251. //  This procedure takes as input the handle to the list box and
  252. //  fills it in with names received from the PBX.
  253. //===================================================================
  254.  
  255. #define Q_LISTSIZE  (MAX_NAMES * PBXMSGSIZE)
  256.  
  257. static PBXPKT pbxPacket;
  258. static BYTE   buffer[Q_LISTSIZE];
  259.  
  260. WORD SubmitListQuery(void)
  261. {
  262.     WORD err;
  263.  
  264.     pbxPacket.usPktID = LISTQUERY;
  265.     pbxPacket.usPktSize = sizeof(PBXPKT);
  266.     pbxPacket.aLQNames.usFirstName = 0;
  267.  
  268.     err = _lwrite(PipeHandle, (LPSTR) &pbxPacket, sizeof(PBXPKT));
  269.  
  270.     return ( (int) err <= 0 ? -1 : 0 );
  271. }
  272.  
  273. //===================================================================
  274. //  ReadListQuery() --
  275. //
  276. //  Reads list query data from the pipe and stores it in an internal
  277. //  structure.
  278. //===================================================================
  279.  
  280. WORD ReadListQuery(void)
  281. {
  282.     LPSTR  pszName, pBufEnd;
  283.     WORD   err, nBytes, i, nBytesLeft, nNames;
  284.  
  285.     err = _lread(PipeHandle, (LPSTR) &pbxPacket, sizeof(PBXPKT));
  286.  
  287.     if ( (int) err <= 0 )        //... PIPE error?
  288.     {
  289.     return -1;
  290.     }
  291.  
  292.     if ( pbxPacket.usRetCode )        //... PBX error?
  293.     {
  294.     wsprintf(format, "PBX failure: %u", pbxPacket.usRetCode);
  295.     DisplayMsgBox(hParent, format);
  296.  
  297.     return pbxPacket.usRetCode;
  298.     }
  299.  
  300.     if ( pbxPacket.aLQNames.usNameCnt == 0 )    //... No names?
  301.     {
  302.     DisplayMsgBox(hParent, "PBX: No names to read" );
  303.  
  304.     return -1;
  305.     }
  306.  
  307.     _fstrcpy(ListQueryNames.szName[0],          //.. copy name
  308.          pbxPacket.aPBXName[0].pszName);
  309.  
  310.     ListQueryNames.wCount = 1;
  311.  
  312.     --pbxPacket.aLQNames.usNameCnt; //... one less name in pipe
  313.  
  314.     nNames = min(MAX_NAMES, pbxPacket.aLQNames.usNameCnt);
  315.  
  316.     if ( nNames == 0 )
  317.     {
  318.     return 0;
  319.     }
  320.  
  321.     //====================================================
  322.     //    If we have made it this far then there is more
  323.     //    than 1 name (i.e our own) in the pipe. nNames
  324.     //    is the number of names we can read from the
  325.     //    pipe. 0 < nNames <= MAX_NAMES. It is very
  326.     //    possible that there exists more than MAX_NAMES
  327.     //    names in the pipe but that is all our name table
  328.     //    can hold so the rest must be read from the pipe
  329.     //    and toast into the bit bucket.
  330.     //====================================================
  331.  
  332.     nBytes = _lread(PipeHandle, buffer, nNames * PBXMSGSIZE);
  333.  
  334.     if ( (int) nBytes == -1 )        //... check for read failure
  335.     {
  336.     return -1;
  337.     }
  338.  
  339.     //====================================================
  340.     //    We have read the names from the pipe!
  341.     //    Now we must put these name in the name table.
  342.     //====================================================
  343.  
  344.     pBufEnd = (buffer + nBytes);
  345.  
  346.     for(i = 1, pszName=buffer;
  347.     pszName != pBufEnd; pszName += PBXMSGSIZE, ++i)
  348.     {
  349.     _fstrcpy(ListQueryNames.szName[i], pszName);
  350.     }
  351.  
  352.     //====================================================
  353.     //    Before we can exit, we must read any names which
  354.     //    are left in the pipe that would not fit in the
  355.     //    name table. nBytes was actual number of bytes
  356.     //    read from the pipe and is a multiple of 16.
  357.     //    Therre might be more names in the pipe that we
  358.     //    cannot hold in the buffer so we toss them into
  359.     //    the bit bucket.
  360.     //====================================================
  361.  
  362.     nBytesLeft = pbxPacket.aLQNames.usNameCnt * PBXMSGSIZE - nBytes;
  363.  
  364.     while( nBytesLeft )
  365.     {
  366.     nBytes = min(nBytesLeft, Q_LISTSIZE);
  367.  
  368.     _lread(PipeHandle, buffer, nBytes);
  369.  
  370.     nBytesLeft -= nBytes;
  371.     }
  372.  
  373.     ListQueryNames.wCount = nNames + 1;
  374.  
  375.     return 0;
  376. }
  377.